home *** CD-ROM | disk | FTP | other *** search
/ Macwelt 1 / Macwelt DVD 1.toast / Software für Mac-OS X / Entwickler-Tools / netbeans / modules / ext / djava.jar / koala / dynamicjava / interpreter / ClassInfoCompiler$MembersVisitor.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-03-14  |  8.4 KB  |  259 lines

  1. package koala.dynamicjava.interpreter;
  2.  
  3. import java.lang.reflect.Modifier;
  4. import java.util.Iterator;
  5. import java.util.LinkedList;
  6. import koala.dynamicjava.classinfo.ClassInfo;
  7. import koala.dynamicjava.classinfo.FieldInfo;
  8. import koala.dynamicjava.classinfo.MethodInfo;
  9. import koala.dynamicjava.interpreter.error.ExecutionError;
  10. import koala.dynamicjava.tree.BlockStatement;
  11. import koala.dynamicjava.tree.BooleanLiteral;
  12. import koala.dynamicjava.tree.ClassInitializer;
  13. import koala.dynamicjava.tree.DoubleLiteral;
  14. import koala.dynamicjava.tree.Expression;
  15. import koala.dynamicjava.tree.FieldDeclaration;
  16. import koala.dynamicjava.tree.FloatLiteral;
  17. import koala.dynamicjava.tree.Identifier;
  18. import koala.dynamicjava.tree.InstanceInitializer;
  19. import koala.dynamicjava.tree.IntegerLiteral;
  20. import koala.dynamicjava.tree.Literal;
  21. import koala.dynamicjava.tree.LongLiteral;
  22. import koala.dynamicjava.tree.MethodDeclaration;
  23. import koala.dynamicjava.tree.Node;
  24. import koala.dynamicjava.tree.ObjectFieldAccess;
  25. import koala.dynamicjava.tree.QualifiedName;
  26. import koala.dynamicjava.tree.ReferenceType;
  27. import koala.dynamicjava.tree.SimpleAssignExpression;
  28. import koala.dynamicjava.tree.StaticFieldAccess;
  29. import koala.dynamicjava.tree.visitor.VisitorObject;
  30.  
  31. public class ClassInfoCompiler$MembersVisitor extends VisitorObject {
  32.    // $FF: synthetic field
  33.    private final ClassInfoCompiler this$0;
  34.  
  35.    public Object visit(ClassInitializer var1) {
  36.       Iterator var2 = var1.getBlock().getStatements().iterator();
  37.  
  38.       while(var2.hasNext()) {
  39.          this.this$0.addToClassInitializer((Node)var2.next());
  40.       }
  41.  
  42.       return null;
  43.    }
  44.  
  45.    public Object visit(InstanceInitializer var1) {
  46.       Iterator var2 = var1.getBlock().getStatements().iterator();
  47.  
  48.       while(var2.hasNext()) {
  49.          this.this$0.addToInstanceInitializer((Node)var2.next());
  50.       }
  51.  
  52.       return null;
  53.    }
  54.  
  55.    public Object visit(FieldDeclaration var1) {
  56.       FieldInfo var2 = this.this$0.classInfo.getField(var1);
  57.       int var3 = var1.getAccessFlags();
  58.       String var4 = var2.getType().getName();
  59.       String var5 = var1.getName();
  60.       if (this.this$0.isInterface) {
  61.          if (Modifier.isPrivate(var3) || Modifier.isProtected(var3)) {
  62.             var1.setProperty("errorStrings", new String[]{var5, this.this$0.classInfo.getName()});
  63.             throw new ExecutionError("interface.field.modifier", var1);
  64.          }
  65.  
  66.          var3 |= 25;
  67.       }
  68.  
  69.       Expression var6 = var1.getInitializer();
  70.       if (var6 != null) {
  71.          if (var6 instanceof Literal && Modifier.isFinal(var3) && Modifier.isStatic(var3)) {
  72.             if (var6 instanceof IntegerLiteral) {
  73.                Integer var12 = (Integer)((Literal)var6).getValue();
  74.                if (var4.equals("byte")) {
  75.                   if (var12 != var12.byteValue()) {
  76.                      throw new ExecutionError("invalid.constant", var1);
  77.                   }
  78.  
  79.                   this.this$0.classFactory.addConstantIntField(var3, var4, var5, var12);
  80.                } else if (var4.equals("short")) {
  81.                   if (var12 != var12.shortValue()) {
  82.                      throw new ExecutionError("invalid.constant", var1);
  83.                   }
  84.  
  85.                   this.this$0.classFactory.addConstantIntField(var3, var4, var5, var12);
  86.                } else if (var4.equals("int")) {
  87.                   this.this$0.classFactory.addConstantIntField(var3, var4, var5, var12);
  88.                } else if (var4.equals("long")) {
  89.                   this.this$0.classFactory.addConstantLongField(var3, var4, var5, new Long(var12.longValue()));
  90.                } else if (var4.equals("float")) {
  91.                   this.this$0.classFactory.addConstantFloatField(var3, var4, var5, new Float(var12.floatValue()));
  92.                } else {
  93.                   if (!var4.equals("double")) {
  94.                      throw new ExecutionError("invalid.constant", var1);
  95.                   }
  96.  
  97.                   this.this$0.classFactory.addConstantDoubleField(var3, var4, var5, new Double(var12.doubleValue()));
  98.                }
  99.             } else if (var6 instanceof LongLiteral) {
  100.                Long var13 = (Long)((Literal)var6).getValue();
  101.                if (var4.equals("long")) {
  102.                   this.this$0.classFactory.addConstantLongField(var3, var4, var5, new Long(var13));
  103.                } else if (var4.equals("float")) {
  104.                   this.this$0.classFactory.addConstantFloatField(var3, var4, var5, new Float(var13.floatValue()));
  105.                } else {
  106.                   if (!var4.equals("double")) {
  107.                      throw new ExecutionError("invalid.constant", var1);
  108.                   }
  109.  
  110.                   this.this$0.classFactory.addConstantDoubleField(var3, var4, var5, new Double(var13.doubleValue()));
  111.                }
  112.             } else if (var6 instanceof FloatLiteral) {
  113.                Float var14 = (Float)((Literal)var6).getValue();
  114.                if (var4.equals("float")) {
  115.                   this.this$0.classFactory.addConstantFloatField(var3, var4, var5, new Float(var14));
  116.                } else {
  117.                   if (!var4.equals("double")) {
  118.                      throw new ExecutionError("invalid.constant", var1);
  119.                   }
  120.  
  121.                   this.this$0.classFactory.addConstantDoubleField(var3, var4, var5, new Double(var14.doubleValue()));
  122.                }
  123.             } else if (var6 instanceof DoubleLiteral) {
  124.                Double var15 = (Double)((Literal)var6).getValue();
  125.                if (!var4.equals("double")) {
  126.                   throw new ExecutionError("invalid.constant", var1);
  127.                }
  128.  
  129.                this.this$0.classFactory.addConstantDoubleField(var3, var4, var5, new Double(var15));
  130.             } else if (var6 instanceof BooleanLiteral) {
  131.                Boolean var16 = (Boolean)((Literal)var6).getValue();
  132.                if (!var4.equals("boolean")) {
  133.                   throw new ExecutionError("invalid.constant", var1);
  134.                }
  135.  
  136.                this.this$0.classFactory.addConstantBooleanField(var3, var4, var5, var16);
  137.             } else {
  138.                String var17 = (String)((Literal)var6).getValue();
  139.                this.this$0.classFactory.addConstantStringField(var3, var4, var5, var17);
  140.             }
  141.          } else {
  142.             this.this$0.classFactory.addField(var3, var4, var5);
  143.             Object var7 = null;
  144.             if (Modifier.isStatic(var3)) {
  145.                ReferenceType var8 = new ReferenceType(this.this$0.classInfo.getName());
  146.                var7 = new StaticFieldAccess(var8, var5);
  147.             } else {
  148.                Identifier var18 = new Identifier("this");
  149.                LinkedList var9 = new LinkedList();
  150.                var9.add(var18);
  151.                QualifiedName var11 = new QualifiedName(var9);
  152.                var7 = new ObjectFieldAccess(var11, var5);
  153.             }
  154.  
  155.             SimpleAssignExpression var19 = new SimpleAssignExpression((Expression)var7, var6);
  156.             if (Modifier.isStatic(var3)) {
  157.                this.this$0.addToClassInitializer(var19);
  158.             } else {
  159.                ((Expression)var19).setProperty("instanceInitializer", (Object)null);
  160.                this.this$0.addToInstanceInitializer(var19);
  161.             }
  162.          }
  163.       } else {
  164.          this.this$0.classFactory.addField(var3, var4, var5);
  165.       }
  166.  
  167.       return null;
  168.    }
  169.  
  170.    public Object visit(MethodDeclaration var1) {
  171.       MethodInfo var2 = this.this$0.classInfo.getMethod(var1);
  172.       int var3 = var2.getModifiers();
  173.       String var4 = var1.getName();
  174.       String var5 = var2.getReturnType().getName();
  175.       boolean var6;
  176.       if (this.this$0.isInterface) {
  177.          if (Modifier.isPrivate(var3) || Modifier.isProtected(var3) || Modifier.isFinal(var3) || Modifier.isStatic(var3)) {
  178.             var1.setProperty("errorStrings", new String[]{var1.getName(), this.this$0.classInfo.getName()});
  179.             throw new ExecutionError("interface.method.modifier", var1);
  180.          }
  181.  
  182.          var3 |= 1025;
  183.          var6 = true;
  184.       } else {
  185.          var6 = Modifier.isAbstract(var3);
  186.       }
  187.  
  188.       ClassInfoCompiler var10000 = this.this$0;
  189.       var10000.hasAbstractMethod |= var6;
  190.       ClassInfo[] var7 = var2.getParameterTypes();
  191.       String[] var8 = new String[var7.length];
  192.  
  193.       for(int var9 = 0; var9 < var7.length; ++var9) {
  194.          var8[var9] = var7[var9].getName();
  195.       }
  196.  
  197.       var7 = var2.getExceptionTypes();
  198.       String[] var13 = new String[var7.length];
  199.  
  200.       for(int var10 = 0; var10 < var7.length; ++var10) {
  201.          var13[var10] = var7[var10].getName();
  202.       }
  203.  
  204.       this.this$0.classFactory.addMethod(var3, var5, var4, var8, var13);
  205.       if (!this.this$0.isInterface && !var6 && this.isRedefinedMethod(var2)) {
  206.          this.this$0.classFactory.addSuperMethodAccessor(var3, var5, var4, var8, var13);
  207.       }
  208.  
  209.       BlockStatement var14 = var1.getBody();
  210.       if ((!var6 || var14 == null) && (!this.this$0.isInterface || var14 == null)) {
  211.          if (!var6 && var14 == null) {
  212.             var1.setProperty("errorStrings", new String[]{var1.getName()});
  213.             throw new ExecutionError("missing.method.body", var1);
  214.          } else {
  215.             if (var14 != null) {
  216.                String var11 = ClassFactory.getMethodIdentifier(this.this$0.classInfo.getName(), var4, var8, this.this$0.interpreter.getClassLoader().toString());
  217.                this.this$0.interpreter.registerMethod(var11, var1, this.this$0.importationManager);
  218.             }
  219.  
  220.             return null;
  221.          }
  222.       } else {
  223.          var1.setProperty("errorStrings", new String[]{var1.getName()});
  224.          throw new ExecutionError("abstract.method.body", var1);
  225.       }
  226.    }
  227.  
  228.    protected boolean isRedefinedMethod(MethodInfo var1) {
  229.       ClassInfo var2 = this.this$0.classInfo.getSuperclass();
  230.       String var3 = var1.getName();
  231.  
  232.       for(ClassInfo[] var4 = var1.getParameterTypes(); var2 != null; var2 = var2.getSuperclass()) {
  233.          MethodInfo[] var5 = var2.getMethods();
  234.  
  235.          label36:
  236.          for(int var6 = 0; var6 < var5.length; ++var6) {
  237.             if (var5[var6].getName().equals(var3)) {
  238.                ClassInfo[] var7 = var5[var6].getParameterTypes();
  239.                if (var7.length == var4.length) {
  240.                   for(int var8 = 0; var8 < var7.length; ++var8) {
  241.                      if (!var7[var8].equals(var4[var8])) {
  242.                         continue label36;
  243.                      }
  244.                   }
  245.  
  246.                   return true;
  247.                }
  248.             }
  249.          }
  250.       }
  251.  
  252.       return false;
  253.    }
  254.  
  255.    ClassInfoCompiler$MembersVisitor(ClassInfoCompiler var1) {
  256.       this.this$0 = var1;
  257.    }
  258. }
  259.